home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1997-03-29 | 11.5 KB | 376 lines |
- 10 'GRIDSQ - Grid Square Locator - 16 MAR 97 rev. 29 MAR 97
- 20 IF EX$=""THEN EX$="EXIT"
- 30 CLS:KEY OFF
- 40 COLOR 7,0,1
- 50 PI=3.14159
- 60 GOTO 120
- 70 '
- 80 '.....clear to bottom of screen
- 90 VIEW PRINT LN TO 24:CLS:VIEW PRINT:LOCATE LN
- 100 RETURN
- 110 '
- 120 '.....start
- 130 CLS:COLOR 15,2
- 140 PRINT " GRID SQUARE LOCATOR (Maidenhead)";
- 150 PRINT TAB(56)"by Dr.Thomas Clark W3IWI ";
- 160 PRINT STRING$(80,32);
- 170 LOCATE CSRLIN-1,12
- 180 PRINT " edited and enhanced for HAMCALC by George Murphy VE3ERP"
- 190 COLOR 1,0:PRINT STRING$(80,223);:COLOR 7,0
- 200 GOSUB 2480
- 210 PRINT
- 220 COLOR 0,7:LOCATE 25,13
- 230 PRINT " Press 1 to continue, 2 for world chart, or 0 to EXIT...";:COLOR 7,0
- 240 Z$=INKEY$:IF Z$=""THEN 240
- 250 IF Z$="0"THEN CLS:RUN EX$
- 260 IF Z$="1"THEN CLS:GOTO 310
- 270 IF Z$="2"THEN CLS:GOTO 2930
- 280 GOTO 240
- 290 LN=4:GOSUB 80
- 300 '
- 310 '.....initial entries
- 320 COLOR 0,7:LOCATE ,29:PRINT " GRID SQUARE LOCATIONS ":COLOR 7,0
- 330 '
- 340 '.....initialize constants:
- 350 E9=10^-6:I=0
- 360 GOSUB 1030
- 370 '
- 380 '.....loop back here for subsequent entries
- 390 I=I+1
- 400 IF I>1 THEN 420
- 410 COLOR 0,7:PRINT " Home QTH : ":COLOR 7,0:GOTO 730
- 420 COLOR 0,7
- 430 PRINT " Choose: Away QTH (c)oordinates, Away QTH (g)rid, or (q)uit? ";
- 440 PRINT "(c/g/q) "
- 450 COLOR 7,0
- 460 T$=INKEY$:IF T$=""THEN 460
- 470 IF T$="c"OR T$="g" OR T$="q"THEN LN=CSRLIN-1:GOSUB 80
- 480 IF T$="c" THEN 720
- 490 IF T$="g" THEN 530
- 500 IF T$="q" THEN 3600
- 510 GOTO 460
- 520 '
- 530 '.....coordinates for given grid square
- 540 PRINT " Away QTH #";I-1;": "
- 550 INPUT " ENTER: Grid square code (enter 2, 4, or all 6 characters)";G$
- 560 LN=CSRLIN-1
- 570 GOSUB 1140:IF L3=6 THEN 620 ELSE BEEP
- 580 TIM=TIMER:COLOR 0,7
- 590 PRINT " Grid square has been padded to middle of cell, i.e. ";G$;" "
- 600 COLOR 7,0:PRINT TAB(20)"Please wait......."
- 610 IF TIMER<TIM+2.5 THEN 610
- 620 GOSUB 1380:GOSUB 1430
- 630 GOSUB 80
- 640 PRINT " Centre of ";G$;" is near";
- 650 SG=SGN(W)
- 660 IF ABS(W)>180 THEN W=(360-ABS(W))*SG
- 670 IF SGN(L)=-1 THEN L$="S"ELSE L$="N"
- 680 IF SGN(W)=-1 THEN W$="W"ELSE W$="E"
- 690 PRINT USING "###.#<UNK! {00F8}>";ABS(L);:PRINT L$;USING "####.#<UNK! {00F8}>";ABS(W);:PRINT W$;
- 700 PRINT " ";:GOTO 850
- 710 '
- 720 PRINT " Away QTH #";I-1;": "
- 730 INPUT " ENTER: Latitude in decimal degrees (+<UNK! {00F8}> if North, -<UNK! {00F8}> if South)";T
- 740 IF T<>0 OR I>1 THEN L=T
- 750 INPUT " ENTER: Longitude in decimal degrees (+<UNK! {00F8}> if East, -<UNK! {00F8}> if West)";T
- 760 IF T<>0 OR I>1 THEN W=T
- 770 LN=CSRLIN-2:GOSUB 80
- 780 GOSUB 1040:PRINT " Grid Square for";
- 790 IF SGN(L)=-1 THEN L$="S"ELSE L$="N"
- 800 IF SGN(W)=-1 THEN W$="W"ELSE W$="E"
- 810 PRINT USING "###.#<UNK! {00F8}>";ABS(L);:PRINT L$;USING "####.#<UNK! {00F8}>";ABS(W);
- 820 PRINT W$;" is ";G$;
- 830 IF I=1 THEN PRINT " (DX calculated from this position)"
- 840 IF I=1 THEN PRINT STRING$(80,205);:GOTO 910
- 850 P$(2)="AWAY":LA(2)=L:LO(2)=W
- 860 GOSUB 1480
- 870 IF A=0 THEN A=360
- 880 PRINT " DX =";USING "##### ";R;:PRINT UU$;USING " @ ###<UNK! {00F8}>";A
- 890 GOTO 380
- 900 '
- 910 P$(1)="HOME":LA(1)=L:LO(1)=W
- 920 COLOR 0,7
- 930 PRINT " Choose: DX in (k)ilometers, (s)tatute miles or (n)autical ";
- 940 PRINT "miles? (k/m/n) ":COLOR 7,0
- 950 U$=INKEY$:IF U$="" THEN 950
- 960 IF U$="k"OR U$="s"OR U$="n"THEN 970 ELSE 950
- 970 IF U$="k"THEN UU$="kilometres":GOTO 1010
- 980 IF U$="s"THEN UU$="stat.miles":GOTO 1010
- 990 IF U$="n"THEN UU$="naut.miles":GOTO 1010
- 1000 GOTO 950
- 1010 LN=CSRLIN-1:GOSUB 80:GOTO 380
- 1020 '
- 1030 '.....grid Square from latitude and longitude
- 1040 W3=180+W
- 1050 W1=INT(W3/20+E9)
- 1060 W2=INT((W3-20*W1)/2+E9)+48:W1=W1+65
- 1070 W3=INT(24*(W3/2-INT(W3/2)+E9))+65
- 1080 L1=INT((L+90)/10+E9):L2=INT(L+90+E9-10*L1)
- 1090 L3=INT((L+90-10*L1-L2)*24+E9):L1=L1+65:L2=L2+48:L3=L3+65
- 1100 G$=CHR$(W1)+CHR$(L1)+CHR$(W2)+CHR$(L2)+CHR$(W3)+CHR$(L3)
- 1110 RETURN
- 1120 '
- 1130 '.....pad grid square if not all 6 characters are given (centre is 55LL)
- 1140 L3=LEN(G$):IF L3>6 THEN 1330
- 1150 IF L3=6 THEN 1190
- 1160 IF L3<4 THEN 1170 ELSE G$=MID$(G$,1,4)+"LL":GOTO 1190
- 1170 IF L3<2 THEN 1330 ELSE G$=MID$(G$,1,2)+"55LL"
- 1180 '
- 1190 '.....Convert 1st 2 characters to upper case, last 2 to upper case
- 1200 Z=ASC(MID$(G$,1,1)):IF Z>96 THEN MID$(G$,1,1)=CHR$(Z-32)
- 1210 Z=ASC(MID$(G$,2,1)):IF Z>96 THEN MID$(G$,2,1)=CHR$(Z-32)
- 1220 Z=ASC(MID$(G$,5,1)):IF Z>96 THEN MID$(G$,5,1)=CHR$(Z-32)
- 1230 Z=ASC(MID$(G$,6,1)):IF Z>96 THEN MID$(G$,6,1)=CHR$(Z-32)
- 1240 '
- 1250 '.....check for valid range of characters
- 1260 T$=MID$(G$,1,1):IF T$<"A"OR T$>"R" THEN 1330
- 1270 T$=MID$(G$,2,1):IF T$<"A"OR T$>"S" THEN 1330
- 1280 T$=MID$(G$,3,1):IF T$<"0"OR T$>"9" THEN 1330
- 1290 T$=MID$(G$,4,1):IF T$<"0"OR T$>"9" THEN 1330
- 1300 T$=MID$(G$,5,1):IF T$<"A"OR T$>"X" THEN 1330
- 1310 T$=MID$(G$,6,1):IF T$<"A"OR T$>"X" THEN 1330
- 1320 RETURN
- 1330 BEEP:COLOR 0,7:PRINT " ";G$;" IS AN INVALID GRID SQUARE ";
- 1340 PRINT ".....Press any key to continue.....":COLOR 7,0
- 1350 IF INKEY$=""THEN 1350
- 1360 GOSUB 80:GOTO 550
- 1370 '
- 1380 '.....grid square to approximate longitude (middle of cell)
- 1390 W1=ASC(MID$(G$,1,1))-65:W2=ASC(MID$(G$,3,1))-48:W3=ASC(MID$(G$,5,1))-65
- 1400 W=-(180-20*W1-2*W2-W3/12-1/24)':IF W<0 THEN W=360+W
- 1410 RETURN
- 1420 '
- 1430 '.....grid Square to approximate latitude (middle of cell)
- 1440 L1=ASC(MID$(G$,2,1))-65:L2=ASC(MID$(G$,4,1))-48:L3=ASC(MID$(G$,6,1))-65
- 1450 L=-90+10*L1+L2+L3/24+1/48
- 1460 RETURN
- 1470 '
- 1480 '.....range (distance) and beam heading
- 1490 RLA(1)=LA(1)*PI/180
- 1500 RLO(1)=LO(1)*PI/180:P$(1)="HOME"
- 1510 RLA(2)=LA(2)*PI/180
- 1520 RLO(2)=LO(2)*PI/180:P$(2)="AWAY"
- 1530 GOSUB 1630 'to make B > A
- 1540 MERID=0 'default value
- 1550 IF LO(1)=LO(2)THEN MERID=1:GOTO 1600 'A & B on same meridian
- 1560 IF ABS(LO(1))+ABS(LO(2))<>180 THEN 1600
- 1570 LA(2)=180-LA(2):MERID=1 'A & B on opposite meridians
- 1580 IF LA(2)>180 THEN LA(2)=LA(2)-90
- 1590 RLA(2)=LA(2)*PI/180 'angle in radians
- 1600 GOSUB 1810 'calculation sub-routine
- 1610 GOTO 1730 'screen print
- 1620 '
- 1630 '.....point B must be place of greater latitude
- 1640 ALA=RLA(1):BLA=RLA(2)
- 1650 IF(ALA=BLA)AND(RLO(1)>RLO(2))THEN 1680 'both on equator
- 1660 IF (ALA<0)AND(BLA<0)THEN ALA=ABS(ALA):BLA=ABS(BLA) 'both south of equator
- 1670 IF BLA>ALA THEN 1710
- 1680 SWAP RLA(1),RLA(2)
- 1690 SWAP RLO(1),RLO(2)
- 1700 SWAP P$(1),P$(2)
- 1710 RETURN
- 1720 '
- 1730 '.....range R (distance)
- 1740 IF U$="n"THEN R=ZD*60
- 1750 IF U$="s"THEN R=ZD*24856.8/360
- 1760 IF U$="k"THEN R=ZD*40000/360
- 1770 '
- 1780 '.....bearing angle A
- 1790 IF P$(1)="HOME" THEN A=XD ELSE A=YD
- 1800 '
- 1810 '.....calculate bearings and distance
- 1820 REM RLA(n) & RLO(n) are LAT & LONG inputs in radians
- 1830 LB=RLA(2) 'latitude of point B in radians
- 1840 LA=RLA(1) 'latitude of point A in radians
- 1850 IF LA=0 AND LB=0 THEN 2040 'both points on equator
- 1860 C=RLO(1)-RLO(2) 'difference in longitude
- 1870 IF C=0 THEN 1910 'both points on same meridian
- 1880 IF ABS(C)=PI THEN 1970 'points on opposite meridians
- 1890 GOTO 2130
- 1900 '
- 1910 '.....A & B both on same meridian
- 1920 ZR=LB-LA:ZD=ZR*180/PI
- 1930 Y=PI:YD=180
- 1940 X=0:XD=0
- 1950 RETURN
- 1960 '
- 1970 '.....A & B on opposite meridians
- 1980 ZR=LB-LA:IF ZR>PI THEN ZR=2*PI-ZR
- 1990 IF ZR<PI THEN Y=0:YD=0:X=0:XD=0
- 2000 IF ZR>PI THEN Y=PI:YD=180:X=PI:XD=180
- 2010 ZD=ZR*180/PI
- 2020 RETURN
- 2030 '
- 2040 '.....A & B both on equator
- 2050 EQUAT=1 'flag
- 2060 Y=PI/2:YD=Y*180/PI
- 2070 X=1.5*PI:XD=X*180/PI
- 2080 L=ABS(RLO(1)-RLO(2))
- 2090 IF L>PI THEN L=2*PI-L
- 2100 ZR=L:ZD=ZR*180/PI
- 2110 GOTO 2290
- 2120 '
- 2130 '.....formula elements
- 2140 F0=1/TAN(C/2) 'cotangent C/2
- 2150 F1=F0*SIN((LB-LA)/2)/COS((LB+LA)/2)
- 2160 IF LB+LA=0 THEN F2=F0*COS((LB-LA)/2)/SIN(9.8E-08):GOTO 2180
- 2170 F2=F0*COS((LB-LA)/2)/SIN((LB+LA)/2)
- 2180 F3=ATN(F1)
- 2190 F4=ATN(F2)
- 2200 '
- 2210 '.....bearings
- 2220 Y=F4+F3 'bearing at point B
- 2230 IF LA<0 AND LB<0 THEN Y=Y+PI:GOTO 2250 'A & B both in southern hemisphere
- 2240 IF ABS(LA)>ABS(LB)THEN Y=Y+PI
- 2250 IF Y<0 THEN Y=Y+2*PI
- 2260 IF Y>=(2*PI)THEN Y=Y-2*PI
- 2270 YD=Y*180/PI 'bearing in degrees at point B
- 2280 '
- 2290 X=F4-F3 'bearing at point A
- 2300 IF LA<0 AND LB<0 THEN X=X+PI:GOTO 2320 'A & B both in southern hemisphere
- 2310 IF ABS(LA)>ABS(LB)THEN X=X+PI
- 2320 IF X<0 THEN X=X+2*PI
- 2330 IF X>=(2*PI)THEN X=X-2*PI
- 2340 XR=2*PI-X 'reciprocal
- 2350 IF XR<0 THEN XR=XR+2*PI
- 2360 IF XR>=(2*PI)THEN XR=XR-2*PI
- 2370 XD=XR*180/PI 'bearing in degrees at point A
- 2380 '
- 2390 '.....distance
- 2400 IF RLO(1)=RLO(2)THEN ZR=ABS(LB-LA):GOTO 2440
- 2410 IF LA=LB THEN LB=LB+9.8E-08:GOTO 1860 'avoids trig function of angle 0
- 2420 F5=TAN((LB-LA)/2)*SIN(F4)/SIN(F3) 'F5=tan ZR/2 (ZR=distance angle)
- 2430 ZR=ABS(2*ATN(F5)) 'distance angle in radians
- 2440 ZD=ZR*180/PI 'distance angle in degrees
- 2450 RETURN
- 2470 '
- 2480 '.....preface
- 2490 TB=7
- 2500 PRINT TAB(TB);
- 2510 PRINT " Grid squares were developed by an international group at a"
- 2520 PRINT TAB(TB);
- 2530 PRINT "conference in Maidenhead, England, hence the name ";
- 2540 PRINT CHR$(34);"Maidenhead";CHR$(34);
- 2550 PRINT TAB(TB);
- 2560 PRINT "grid squares."
- 2570 PRINT TAB(TB);
- 2580 PRINT " Grid squares are based on latitude and longitude. Each square is"
- 2590 PRINT TAB(TB);
- 2600 PRINT "1<UNK! {00F8}> high x 2<UNK! {00F8}> wide, further divided into sub-squares only a few"
- 2610 PRINT TAB(TB);
- 2620 PRINT "kilometres wide. Grid squares are coded with a 2-letter/2-number/"
- 2630 PRINT TAB(TB);
- 2640 PRINT "2-letter code (such as FN04HO). Most people just use the first four"
- 2650 PRINT TAB(TB);
- 2660 PRINT "characters (such as FN04), which is the grid square. The last two"
- 2670 PRINT TAB(TB);
- 2680 PRINT "letters are generally used only when it is desired to pinpont a"
- 2690 PRINT TAB(TB);
- 2700 PRINT "a location within a sub-square."
- 2710 PRINT TAB(TB);
- 2720 PRINT " This program computes the grid square code for any latitude/"
- 2730 PRINT TAB(TB);
- 2740 PRINT "longitude in the world, or the coordinates of the approximate"
- 2750 PRINT TAB(TB);
- 2760 PRINT "centre of any grid square or sub-square. It also computes distances"
- 2770 PRINT TAB(TB);
- 2780 PRINT "and beam headings between specified grid squares or sub-squares."
- 2790 PRINT TAB(TB);
- 2800 PRINT " Coordinates need only be known within an accuracy of 0.1<UNK! {00F8}> which"
- 2810 PRINT TAB(TB);
- 2820 PRINT "is about 11 km north-south, and east-west about 11 km at the"
- 2830 PRINT TAB(TB);
- 2840 PRINT "equator, 8 km at 45<UNK! {00F8}> latitude, and 1 km at 85<UNK! {00F8}> latitude."
- 2850 PRINT TAB(TB);
- 2860 PRINT " All computations are in decimal degrees. To convert deg/min/sec"
- 2870 PRINT TAB(TB);
- 2880 PRINT "coordinates to decimal degrees, run the EQIVALENT VALUES program."
- 2890 PRINT TAB(TB);
- 2900 PRINT " (ref. The ARRL OPERATING MANUAL, 5th Edition, pp.12-4 to 12-6)";
- 2910 RETURN
- 2920 '
- 2930 '.....world chart
- 2940 PRINT TAB(12)"M A I D E N H E A D G R I D S Q U A R E F I E L D S"
- 2950 PRINT TAB(18)"with First Two Characters of Grid Square Code"
- 2960 TB=13
- 2970 PRINT TAB(TB+10)"Degrees West";TAB(TB+35)"Degrees East"
- 2980 PRINT TAB(TB)" 160<UNK! {00F8}> 120<UNK! {00F8}> 80<UNK! {00F8}> 40<UNK! {00F8}> 0<UNK! {00F8}> 40<UNK! {00F8}> 80<UNK! {00F8}> 120<UNK! {00F8}> 160<UNK! {00F8}>"
- 2990 LN=CSRLIN:LOCATE LN
- 3000 FOR RO=82 TO 65 STEP-1
- 3010 PRINT STRING$(TB,32)+"CALL";
- 3020 FOR CO=65 TO 82
- 3030 IF CO=73 THEN I$="OPEN"ELSE I$="CALL"
- 3040 PRINT CHR$(CO)+CHR$(RO)+I$;
- 3050 NEXT CO
- 3060 I$="THENINSTRTHEN":J$=I$+I$+I$+I$+I$+I$+I$+I$
- 3070 IF RO=74 THEN PRINT STRING$(TB,32)+"PSETTHEN"+J$+"THENTAB(THEN"+J$+"THEN<0xB5!>"
- 3080 IF RO=74 THEN LOCATE CSRLIN-1,TB+24:COLOR 0,7:PRINT "DEFSNGEQUATORDEFDBL":COLOR 7,0
- 3090 NEXT RO
- 3100 FOR Z=0 TO 8
- 3110 LOCATE LN+8-Z,TB-11
- 3120 PRINT USING "##";Z*10;:PRINT "<UNK! {00F8}>N -";STR$(Z*10+10);"<UNK! {00F8}>N"
- 3130 NEXT Z
- 3140 FOR Z=0 TO 8
- 3150 LOCATE LN+10+Z,TB-11
- 3160 PRINT USING "##";Z*10;:PRINT "<UNK! {00F8}>S -";STR$(Z*10+10);"<UNK! {00F8}>S"
- 3170 NEXT Z
- 3180 LOCATE 24
- 3190 PRINT TAB(TB)"180<UNK! {00F8}> 140<UNK! {00F8}> 100<UNK! {00F8}> 60<UNK! {00F8}> 20<UNK! {00F8}> 20<UNK! {00F8}> 60<UNK! {00F8}> 100<UNK! {00F8}> 140<UNK! {00F8}> 180<UNK! {00F8}>";
- 3200 LOCATE 11
- 3210 LOCATE ,70:PRINT "Each Field"
- 3220 LOCATE ,70:PRINT "contains"
- 3230 LOCATE ,70:PRINT "100 grid"
- 3240 LOCATE ,70:PRINT "squares,"
- 3250 LOCATE ,70:PRINT "each being"
- 3260 LOCATE ,70:PRINT "2<UNK! {00F8}> wide x"
- 3270 LOCATE ,70:PRINT "1<UNK! {00F8}> high."
- 3280 GOSUB 3640
- 3290 '
- 3300 '.....draw sub-square
- 3310 CLS
- 3320 PRINT TAB(2)"1<UNK! {00F8}> High x 2<UNK! {00F8}> Wide GRID SQUARES with ";
- 3330 PRINT "3rd and 4th Characters of Grid Square Code";
- 3340 PRINT TAB(20)"(xx = first 2 letters of Grid Square Code)"
- 3350 LN=CSRLIN:TB=5
- 3360 Y$="SOUNDSOUNDSOUNDBSAVESOUNDSOUNDSOUND"
- 3370 PRINT TAB(TB)"VARPTRSOUNDSOUNDSOUND";:FOR Y=1 TO 9:PRINT Y$;:NEXT Y:PRINT "SOUNDSOUNDSOUNDCOLOR"
- 3380 FOR X=1 TO 9
- 3390 PRINT
- 3400 Y$="SOUNDSOUNDSOUNDBEEPSOUNDSOUNDSOUND"
- 3410 PRINT TAB(TB)"BLOADSOUNDSOUNDSOUND";:FOR Y=1 TO 9:PRINT Y$;:NEXT Y:PRINT "SOUNDSOUNDSOUND<0xB4!>"
- 3420 NEXT X
- 3430 PRINT
- 3440 Y$="SOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUND"
- 3450 PRINT TAB(TB)"CLSSOUNDSOUNDSOUND";:FOR Y=1 TO 9:PRINT Y$;:NEXT Y:PRINT "SOUNDSOUNDSOUND'"
- 3460 LOCATE LN+1
- 3470 FOR Y=9 TO 0 STEP-1
- 3480 PRINT TAB(TB)"CALL";
- 3490 FOR X=0 TO 9
- 3500 Z=Y+X*10:Z$=STR$(Z):Z$=RIGHT$(Z$,LEN(Z$)-1)
- 3510 IF LEN(Z$)<2 THEN Z$="0"+Z$
- 3520 Z$=" xx"+Z$+" CALL"
- 3530 PRINT Z$;
- 3540 NEXT X:PRINT "":PRINT
- 3550 NEXT Y
- 3560 PRINT TAB(5)"CALLDEFSNG";STRING$(14,196);" 10<UNK! {00F8}> HIGH x 20<UNK! {00F8}> WIDE GRID SQUARE FIELD ";
- 3570 PRINT STRING$(14,196);"DEFDBLCALL";
- 3580 GOTO 3600
- 3590 '
- 3600 '.....end
- 3610 GOSUB 3640:GOTO 120
- 3620 END
- 3630 '
- 3640 'HARDCOPY
- 3650 GOSUB 3760:LOCATE 25,2:COLOR 14,6
- 3660 PRINT " Press 1 to print screen, 2 to print screen & ";
- 3670 PRINT "advance paper, or 3 to continue.";:COLOR 7,0
- 3680 Z$=INKEY$:IF Z$="3"THEN GOSUB 3760:RETURN
- 3690 IF Z$="1"OR Z$="2"THEN GOSUB 3760:GOTO 3710
- 3700 GOTO 3680
- 3710 FOR QX=1 TO 24:FOR QY=1 TO 80
- 3720 LPRINT CHR$(SCREEN(QX,QY));
- 3730 NEXT QY:NEXT QX
- 3740 IF Z$="2"THEN LPRINT CHR$(12)
- 3750 GOTO 3650
- 3760 LOCATE 25,1:PRINT STRING$(80,32);:RETURN
-